import self
from ursina import *
from ursina.prefabs.first_person_controller import FirstPersonController
from ursina.shaders import lit_with_shadows_shader

app = Ursina()
Entity.default_shader = lit_with_shadows_shader

DirectionalLight(y=2, rotation=(45, 45, 0))
Sky()

ground = Entity(model='plane', collider='box', scale=300, texture='grass')
for i in range(19):
    Entity(model='cube', scale=2, texture='brick',
           texture_scale=(1, 2),
           x=random.uniform(-16, 16),
           z=random.uniform(-10, 10) + 8,
           collider='box',
           scale_y=random.uniform(2, 3),
           origin_y=-0.5)

editor_camera = EditorCamera(enabled=False)


def input_pause(key):
    if key == 'tab':
        editor_camera.enabled = not editor_camera.enabled
        mouse.locked = not editor_camera.enabled
        player.cursor.enabled = not editor_camera.enabled
        player.visible_self = editor_camera.enabled
        editor_camera.position = player.position

pause_handler = Entity(input=input_pause)

player = FirstPersonController(model='cube', color=color.orange, z=-10, origin_y=-0.2, speed=8, collider='box')
gun = Entity(model='cube', parent=camera, scale=(0.3, 0.2, 0.5), position=(0.5, -0.25, 0.5), color=color.red,
             on_cooldown=False)
gun.flash = Entity(parent=gun, model='quad', z=1, color=color.yellow, enabled=False)


def shoot():
    if not gun.on_cooldown:
        gun.on_cooldown = True
        gun.flash.enabled = True

        from ursina.prefabs.ursfx import ursfx
        ursfx([(0.0, 0.0), (0.1, 0.9), (0.15, 0.75), (0.3, 0.14), (0.6, 0.0)], volume=0.5, wave='noise',
              pitch=random.uniform(-13, -12), pitch_change=-12, speed=3.0)
        invoke(gun.flash.disable, delay=0.15)
        invoke(setattr, gun, 'on_cooldown', False, delay=0.15)
        if mouse.hovered_entity and hasattr(mouse.hovered_entity, 'hp'):
            mouse.hovered_entity.blink(color.red)
            mouse.hovered_entity.hp -= 10
            if mouse.hovered_entity.hp <= 0:
                destroy(mouse.hovered_entity)
            mouse.hovered_entity.health_bar.scale_x = mouse.hovered_entity.hp / mouse.hovered_entity.max_hp * 1.5


def update():
    if held_keys['left mouse']:
        shoot()


class Enemy(Entity):
    def __init__(self, add_to_scene_entities=True, **kwargs):
        super().__init__(add_to_scene_entities,
                         model='cube', collider='box',
                         scale_y=2, origin_y=-0.5,
                         color=color.white,
                         **kwargs)
        self.health_bar = Entity(parent=self, model='cube', color=color.red, y=1.2,
                                 scale=(1.5, 0.1, 0.1))

        self.max_hp = 1000
        self.hp = self.max_hp


    def update(self):
      self.look_at_2d(player.position, 'y')

      hit_info = raycast(self.position + Vec3(0, 1, 0), self.forward, 30, ignore=(self,), debug=True)
      if hit_info.entity == player:
        if distance_xz(self.position, player.position) > 2:
            self.position = self.position + self.forward * time.dt*5

test=Text(text='+',scale=2,position=(-0.015,0.023,0),color=color.red)
for i in range(10):
    Enemy(x=i * 8)

app.run()
